#include<iostream>

#include"Hash.h"

namespace MyHash{

template <class K,class V, class Hash = HashFunc<K>>
class unordered_map {
 public:
  struct mapKeyOfT {
    const K& operator()(const std::pair<K,V>& data) { return data.first; }
  };
  typedef typename MyHash::HashTable<K, std::pair<const K, V>, mapKeyOfT,
                                     Hash>::iterator iterator;
  typedef typename MyHash::HashTable<K, std::pair<const K, V>, mapKeyOfT,
                                     Hash>::iterator const_iterator;

  iterator begin() { return _Ht.begin(); }
  iterator end() { return _Ht.end(); }
  const_iterator begin() const { return _Ht.begin(); }
  const_iterator end() const { return _Ht.end(); }

  std::pair<iterator, bool> insert(const std::pair<K, V>& data) {
    return _Ht.Insert(data);
  }

  iterator find(const K& key) { return _Ht.Find(key); }

  bool erase(const K& key) { return _Ht.Erase(key); }

  V& operator[](const K& key) {
    std::pair<iterator,bool> ret = insert(std::make_pair(key, V()));
    // ret.first 是 iterator 类型
    return ret.first->second;  // 访问 iterator 指向的 HashNode 的 _data 成员的 second 部分
  }

 protected:
 
 private:
  HashTable<K,std::pair< const K, V>, mapKeyOfT, Hash> _Ht;
};
}